package mornd.test1.comps;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import javax.annotation.PostConstruct;

/**
 * @author: mornd
 * @dateTime: 2023/5/5 - 14:51
 *
 * BeanNameAware, InitializingBean 执行顺序：先执行 Aware 接口，然后再到 InitializingBean
 */
@Slf4j
public class Bean1 implements BeanNameAware, InitializingBean {
    @Override
    public void setBeanName(String name) {
        log.debug(this + "的beanName========>" + name);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.debug(this + "afterPropertiesSet()方法执行");
    }

    /**
     * 默认@Autowired 这里会失效，因为解析Autowired需要用到AutowiredAnnotationPostProcessor后置处理器，属于扩展功能
     * 而 Aware 接口属于内置功能，在这里是不会失效的
     * 内置功能好处：内置的功能不受扩展功能的影响，总会执行，spring 内部大量用到
     */
    @Autowired
    public void test(ApplicationContext applicationContext) {
        log.debug(this + "的test()方法执行" + applicationContext);
    }

    // 同上，也会失效
    @PostConstruct
    public void init() {
        log.debug(this + "的init()方法执行");
    }
}
